跳到主要内容

CLI Arguments

We said before that by default:

  • CLI options are optional
  • CLI arguments are required

当然,我们可以改变这一条规律

可选的 CLI Arguments

明确指定 typer.Argument() 来创建一个 CLI Argument

import typer
from typing_extensions import Annotated

# instead of `def main(name: str):`
def main(name: Annotated[str, typer.Argument()]):
print(f"Hello {name}")


if __name__ == "__main__":
typer.run(main)

有了 Annotated 的加持,我们可以定义一个选填的 CLI Argument 了:

name: Annotated[str | None, typer.Argument()] = None
# or
name: Annotated[str, typer.Argument()] = "Wade Wilson"

比如:

from typing import Optional

import typer
from typing_extensions import Annotated


def main(name: Annotated[Optional[str], typer.Argument()] = None):
if name is None:
print("Hello World!")
else:
print(f"Hello {name}")


if __name__ == "__main__":
typer.run(main)

image-20240710142414069

notice that now [NAME] has brackets ("[" and "]") around (before it was just NAME) to denote that it's optional, not required.

动态默认值

使用 default_factory 来定义动态默认值

import random

import typer
from typing_extensions import Annotated


def get_name():
return random.choice(["Deadpool", "Rick", "Morty", "Hiro"])


def main(name: Annotated[str, typer.Argument(default_factory=get_name)]):
print(f"Hello {name}")


if __name__ == "__main__":
typer.run(main)

每次执行命令,name 都会随机变化

help 说明

使用 help 参数添加注释

import typer
from typing_extensions import Annotated


def main(name: Annotated[str, typer.Argument(help="The name of the user to greet")]):
print(f"Hello {name}")


if __name__ == "__main__":
typer.run(main)

会在 --help 中显示

image-20240710143408222

设置默认值注释

当然,如果 argument 有默认值的话,它也会在 --help 中展示出来

name: Annotated[str, typer.Argument(help="Who to greet")] = "World"

image-20240710143550624

使用 show_default=False 来屏蔽默认值的展示

name: Annotated[
str, typer.Argument(help="Who to greet", show_default=False)
] = "World",

使用 show_default 传入字符串,还可以自定义 argument 的默认值展示

    name: Annotated[
str,
typer.Argument(
help="Who to greet", show_default="Deadpoolio the amazing's name"
),
] = "Wade Wilson",

image-20240710144005963

自定义 Argument 名

默认的 Argument 名是大写的,可以使用 metavar 来自定义

import typer
from typing_extensions import Annotated


def main(name: Annotated[str, typer.Argument(metavar="✨username✨")] = "World"):
print(f"Hello {name}")


if __name__ == "__main__":
typer.run(main)
image-20240710144308461

读取环境变量

use the envvar parameter for typer.Argument():

name: Annotated[str, typer.Argument(envvar="AWESOME_NAME")] = "World"

name 读取的优先级:

  1. CLI argument
  2. Environment variable
  3. Default value
image-20240710144803626

还可以定义多个环境变量,bro

name: Annotated[str, typer.Argument(envvar=["AWESOME_NAME", "GOD_NAME"])] = "World"

help 说明的展示是这样的

image-20240710145215694

使用 show_envvar=False 隐藏环境变量的展示

name: Annotated[
str, typer.Argument(envvar="AWESOME_NAME", show_envvar=False)
] = "World",